# version 0.1 du projet PiFire

import urwid
import os

class PiFire:
	'Classe de gestion du tir'
	seqFile = '' # Fichier de sequence charge
	seqFolder = '/home/pi/tir_sequences' # Dossier ou chercher les fichiers de sequence
	
	
	def __init__(self):
		self.reboot_relays() # On ferme tous les relais au lancement
	
	# Getter dossiers des fichiers de sequence
	def get_seqFolder(self):
		return self.seqFolder
	
	# Setter du fichier de sequence
	def set_seqFile(self,file=''):
		return self.parse_seqFile(file)
		
	# Getter du fichier de sequence
	def get_seqFile(self):
		if (self.seqFile == ''):
			return 'Aucun fichier choisi'
		else:
			return self.seqFile
	
	# Methode de parsing du fichier de sequence
	def parse_seqFile(self,file):
		self.seqFile = file
		if (self.seqFile != ''):
			return 'Fichier parse pret a tirer'
		else:
			return 'Aucun fichier parse'
		
	# Methodes de base pour controler les relais
	def on_relay(self,relayNum):
		return

	def off_relay(self,relayNum):
		return
	
	# Methode pour passer tous les relais a OFF
	def reboot_relays(self):
		return
		
	# Methode pour charger un fichier de sequence
	def load_seq(self):
		return
		
	# Methode pour lancer le fichier de sequence
	def launch_seq(self):
		return

class Menus:
	'Classe de gestion de la navigation dans les menus'
	
	TitleLvl1 = 'PiFire' # Nom de l'application

	# Initialisation du menu principal et de l'overlay
	def __init__(self,firesys):
		self.fireSystem = firesys
		self.menu()
		self.main = urwid.Padding(self.menuLvl1, left=2, right=2)
		self.top = urwid.Overlay(self.main, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
		align='center', width=('relative', 60),
		valign='middle', height=('relative', 60),
		min_width=20, min_height=9)
	
	# renvoie l'overlay pour la premiere execution
	def initialize(self):
		return self.top
	
	# Creation d'un bouton
	def create_button(self,text,function):
		button = urwid.Button(text)
		urwid.connect_signal(button, 'click', eval('self.'+function), text)
		return urwid.AttrMap(button, None, focus_map='reversed')
			
	# Construit le menu de premier niveau (lance fois au debut et a chaque changement de fichier de sequence)
	def menu(self):
		body = [urwid.Text(Menus.TitleLvl1), urwid.Divider()]
		body.append(urwid.Text(('banner', u"Maintenance"), align='center'))
		body.append(self.create_button('Reset Relais','item_chosen'))
		body.append(self.create_button('Test de ligne','item_chosen'))
		body.append(self.create_button('Choix Fichier Sequence','file_choose'))
		body.append(urwid.Text(self.fireSystem.get_seqFile()))
		body.append(urwid.Divider())
		body.append(urwid.Text(('banner', u"Tir"), align='center'))
		body.append(self.create_button('Lancement de ligne','item_chosen'))
		body.append(self.create_button('Lancement pas a pas','item_chosen'))
		body.append(self.create_button('Lancement Sequence','item_chosen'))
		body.append(urwid.Divider())
		body.append(self.create_button('Sortie','exit_program'))
		self.menuLvl1 = urwid.ListBox(urwid.SimpleFocusListWalker(body))
	
	# Methode pour selectionner un fichier de tir
	def file_choose(self,button,choice):
		listFile = os.listdir(self.fireSystem.get_seqFolder())
		# creation menu
		body = [urwid.Text('Fichier de tir'), urwid.Divider()]
		for text in listFile:
			body.append(self.create_button(text,'file_set'))
		body.append(urwid.Divider())
		body.append(self.create_button('Ne pas choisir','file_set'))
		body.append(urwid.Divider())
		body.append(self.create_button('Retour au menu','re_build_menu'))
		self.main.original_widget = urwid.Padding(urwid.ListBox(urwid.SimpleFocusListWalker(body)), left=2, right=2)
	
	# Methode utilisee pour positionner le fichier de tir
	def file_set(self,button,choice):
		if (choice != 'Ne pas choisir'):
			body = [urwid.Text('Fichier choisi '+choice), urwid.Divider()]
			retour = self.fireSystem.set_seqFile(choice)
		else:
			body = [urwid.Text('Pas de choix effectue'), urwid.Divider()]
			retour = self.fireSystem.set_seqFile()
		body.append(urwid.Text(('banner', retour), align='center'))
		self.menu()
		body.append(urwid.Divider())
		body.append(self.create_button('Retour au menu','re_build_menu'))
		self.main.original_widget = urwid.Padding(urwid.ListBox(urwid.SimpleFocusListWalker(body)), left=2, right=2)
		
	# Methode standard (do nothing) appelee par un choix sur un menu de premier niveau
	def item_chosen(self,button, choice):
		response = urwid.Text([u'Choix effectue : ', choice,u'\n'])
		done = urwid.Button(u'Ok')
		urwid.connect_signal(done, 'click', self.re_build_menu)
		self.main.original_widget = urwid.Filler(urwid.Pile([response,
			urwid.AttrMap(done, None, focus_map='reversed')]))
	
	# Renvoi au menu de premier niveau
	def re_build_menu(self,button,choice=1):
		self.main.original_widget = urwid.Padding(self.menuLvl1, left=2, right=2)
	
	# Sors du programme
	def exit_program(self,button,choice):
		raise urwid.ExitMainLoop()

firesystem = PiFire()
menu = Menus(firesystem)
urwid.MainLoop(menu.initialize(), palette=[('reversed', 'standout', '')]).run()